package org.batatasframework.support.database.sql;

import org.batatasframework.support.database.AliasNamed;
import org.batatasframework.support.database.metadatas.TableMetadata;

/**
 * <pre>
 * 一个已经肯定的被查询的表；
 * 为什么要与{@link TableTarget}分开呢？因为{@link TableTarget}需要由策略对象来创建的，
 * 而这个类已经是可以组成数据库查询的查询语句了。也可以考虑合并
 * </pre>
 * @author jackson
 *
 */
public class TableInstance implements AliasNamed{
	
	/** 在具体生成主表或关联表的时候，才生成别名 */
	protected String alias;
	
	protected TableMetadata tableMetadata;
	
	public TableInstance(TableMetadata tableMetadata, String alias){
		this.tableMetadata = tableMetadata;
		this.alias = alias;
	}
	
	/** 根据已经定义的别名，来查找关联表的关联对象 */
	public boolean check(String alias){
		return alias.equals(this.alias);
	}
	
	@Override
	public String getAlias() {
		return alias;
	}

	/**
	 * 根据别名，查找这个别名所定义的主表或关联表
	 */
	public TableInstance find(String alias){
		if(check(alias)) return this;
		throw new NullPointerException("找不到指定的表：" + alias);
	}
	
	public TableMetadata getTableMetadata() {
		return tableMetadata;
	}
	
	public String getTableName() {
		return tableMetadata.getTableName();
	}
}
